/*
Copyright 2010,2011 Matt Van Der Westhuizen

This file is part of CGLL.

CGLL is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

CGLL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with CGLL.  If not, see <http://www.gnu.org/licenses/>.
*/

package org.chaoticengine.cgll.entity.component.render;

import org.chaoticengine.cgll.entity.component.RenderComponent;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.geom.Rectangle;
import org.newdawn.slick.geom.Vector2f;
import org.newdawn.slick.state.StateBasedGame;
import org.simpleframework.xml.Element;

/**
 * Component for rendering game entities by using a image representation. The
 * bounding rectangle for the entity is set as the size of the image.
 *
 * @author Matt v.d. Westhuizen
 */
public class ImageRenderComponent extends RenderComponent {
    protected Image img = null;
    protected boolean rotate = true;

    public ImageRenderComponent() {
        super();
    }

    @Element(name="image", required=true)
    public String getImage() {
        if (img != null) {
            return(img.getResourceReference());
        } else {
            return("");
        }
    }

    @Element(name="image", required=true)
    public void setImage(String filename) {
        try {
            this.img = new Image(filename);
        } catch (SlickException sEx) {
            sEx.printStackTrace();
            System.out.println("Error: Failed to load image '" + filename + "'.");
        }
    }

    public boolean isRotate() {
        return rotate;
    }

    public void setRotate(boolean rotate) {
        this.rotate = rotate;
    }

    @Override
    public void onSetOwner() {
        Vector2f pos = owner.getPosition();
        owner.setBounds(new Rectangle(pos.getX() - img.getWidth() / 2.0f,
                pos.getY() - img.getHeight() / 2.0f,
                img.getWidth(),
                img.getHeight()));
        owner.setTranslation(new Vector2f(-img.getWidth() / 2.0f, -img.getHeight() / 2.0f));
    }

    @Override
    public void render(GameContainer gc, StateBasedGame sb, Graphics gr) {
        // Translation & rotation
        gr.translate(owner.getPosition().x, owner.getPosition().y);
        if (rotate) {
            gr.rotate(0.0f, 0.0f, owner.getRotation());
        }
        gr.translate(owner.getTranslation().x, owner.getTranslation().y);

        // Rendering
        img.setAlpha(owner.getAlpha());
        gr.drawImage(img, 0.0f, 0.0f);

        // Undo translation & rotation
        gr.translate(-owner.getTranslation().x, -owner.getTranslation().y);
        if (rotate) {
            gr.rotate(0.0f, 0.0f, -owner.getRotation());
        }
        gr.translate(-owner.getPosition().x, -owner.getPosition().y);
    }
}
